package utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

/**
 * 文件压缩解压缩工具类
 * @author iuie
 * @param <T>
 */
public final class ZipUtils {
	
	private ZipUtils() {
		
	}
	/**
	 * 解压文件
	 * @param zipFilePath
	 * @param descDir
	 * @throws IOException
	 * @date 2018年6月9日下午2:21:36
	 */
	public static void unzipFile(String zipFilePath, String descDir) throws IOException {
		unzipFile(new File(zipFilePath), descDir);
	}
	
	/**
	 * 解压文件
	 * @param zipFile
	 * @param descDir
	 * @throws IOException
	 * @date 2018年6月9日下午2:22:23
	 */
	public static void unzipFile(File zipFile, String descDir) throws IOException {
		File descPath = new File(descDir);
	    if (!descPath.exists()) {
	    	descPath.mkdirs();
	    }
	    // 解决zip文件中有中文目录或者中文文件
	    ZipFile zip = new ZipFile(zipFile, Charset.forName("GBK"));
	    
	    Enumeration<?> entries = zip.entries();
	    while (entries.hasMoreElements()) {
	    	ZipEntry entry = (ZipEntry)entries.nextElement();
	    	String zipEntryName = entry.getName();
	    	InputStream in = zip.getInputStream(entry);
	    	String outPath = (descDir+zipEntryName).replaceAll("\\*", "/");;
	    	// 判断路径是否存在,不存在则创建文件路径
	    	File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
	    	if (!file.exists()) {
	    		file.mkdirs();
	    	}
	    	// 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
			if (new File(outPath).isDirectory()) {
				continue;
			}
			// 输出文件路径信息
			System.out.println(outPath);
			OutputStream out = new FileOutputStream(outPath);
			byte[] buf1 = new byte[1024];
			int len;
			while ((len = in.read(buf1)) > 0) {
				out.write(buf1, 0, len);
			}
			in.close();
			out.close();
	    }
	    zip.close();
	    System.out.println("******************解压完毕********************");
	}
}
